package com.yxx.strategy.searchStrategyImpl;

import com.yxx.constant.ElasticConstant;
import com.yxx.mapper.ArticleMapper;
import com.yxx.entityModel.vo.response.ArticleSearchResponse;
import com.yxx.strategy.SearchStrategy;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * MySQL搜索策略
 * @author yuxiangxun
 * @date 2025/2/23
 */
@Service("mysqlSearchStrategyImpl")
public class MysqlSearchStrategyImpl implements SearchStrategy {

    @Resource
    private ArticleMapper articleMapper;

    @Override
    public List<ArticleSearchResponse> searchArticle(String keyword) {
        // 如果请求传递过来的关键字为空，直接返回空集合
        if(StringUtils.isBlank(keyword)){
            return new ArrayList<>();
        }
        // 通过关键字查询文章列表信息
        List<ArticleSearchResponse> articleSearchResponsesList = articleMapper.searchArticle(keyword);
        // 返回文章列表信息
        return articleSearchResponsesList.stream()
                .map(article -> {
                    // 获取关键词在文章内容中第一次出现的位置
                    // 原文段落 (保存一份，后面需要截取高亮段落)
                    String articleHighLightContent = article.getArticleContent();
                    // 第一次出现的位置
                    int index = article.getArticleContent().indexOf(keyword);
                    // 如果下标存在
                    if(index != -1){
                        // 获取关键词前25个字符的位置，如果小于25，则从0开始
                        int preIndex = index > 25 ? index - 25 : 0;
                        // 获取关键词（第一个字母截止）前面段文字
                        String preText = article.getArticleContent().substring(preIndex,index);
                        // 获取关键词（最后一个字符）的下标
                        int last = index + keyword.length();
                        // 获取关键字后面的文字
                        int postLength = article.getArticleContent().length() - last;
                        // 如果后面段文字的长度大于175，则取前175个字符,否则取全部
                        int postIndex = postLength > 175 ? last + 175 : last + postLength;
                        // 获取关键字（第一个字母开始）后面的段文字
                        String postText = article.getArticleContent().substring(index, postIndex);
                        // 文章内容高亮
                        articleHighLightContent = (preText+postText).replaceAll(keyword, ElasticConstant.PRE_TAG + keyword + ElasticConstant.POST_TAG);
                    }
                    // 文章标题高亮
                    String articleHighLightTitle = article.getArticleTitle().replaceAll(keyword, ElasticConstant.PRE_TAG + keyword + ElasticConstant.POST_TAG);
                    // 返回处理完善的文章信息（包括文章id、文章标题高亮、文章内容高亮）
                    return ArticleSearchResponse.builder()
                            .id(article.getId())
                            .articleTitle(articleHighLightTitle)
                            .articleContent(articleHighLightContent)
                            .build();
                })
                .collect(Collectors.toList());
    }
}
